package rothag.views.gamestep.business;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import rothag.controller.MainController;
import rothag.graphics.*;
import rothag.models.ressources.*;
import rothag.views.*;
import rothag.views.gamestep.GameStepJPanelBase;

/**
 *
 * @author Gaetan, Gulian, Francois
 */
public class BusinessJPanel extends GameStepJPanelBase implements ActionListener {

    int nbBateau;
    private HashMap<Class, Integer> nbRessource;
    private HashMap<Class, Integer> nbRessourceSel;
    private int tabRessource[] = {0, 0, 0, 0, 0};
    private JButtonBase etapeSuivante;
    private JLabel businessTopLabel, business2TopLabel;
    private JLabel resCommerceBois, resCommerceTissu, resCommercePoterie, resCommercePierre, resCommerceFer;
    private JLabel resCommerceMoinBois, resCommerceMoinTissu, resCommerceMoinPoterie, resCommerceMoinPierre, resCommerceMoinFer;
    private JLabel resCommercePlusBois, resCommercePlusTissu, resCommercePlusPoterie, resCommercePlusPierre, resCommercePlusFer;
    private JLabel ressourceLabel;
    private JLabel nbBateauLabel;
    private JLabel explicationLabel;
    private JButtonBase boutonPlusResFer, boutonMoinResFer;
    private JButtonBase boutonPlusResTissu, boutonMoinResTissu;
    private JButtonBase boutonPlusResBois, boutonMoinResBois;
    private JButtonBase boutonPlusResPierre, boutonMoinResPierre;
    private JButtonBase boutonPlusResPoterie, boutonMoinResPoterie;
    private JButtonBase clearBusiness;

    public BusinessJPanel(MainController controller) {
        super(controller);

        // Bouton étape suivante
        etapeSuivante = new JButtonBase("Etape suivante");
        etapeSuivante.setBounds(550, GraphicsParameters.smallFrameTopY + 60, 120, 40);
        etapeSuivante.addActionListener(this);
        add(etapeSuivante);

        // Bouton pour nettoyer
        clearBusiness = new JButtonBase("Annuler");
        clearBusiness.setBounds(550, GraphicsParameters.bigFrameBottomY - 45, 120, 40);
        clearBusiness.addActionListener(this);
        add(clearBusiness);

        // Texte
        businessTopLabel = new JLabel();
        businessTopLabel.setFont(GraphicsHelper.getFont(13, null));
        businessTopLabel.setForeground(Color.white);
        businessTopLabel.setBounds(100, GraphicsParameters.bigFrameBottomY - 380, 300, 40);
        businessTopLabel.setText("Ressources données :");
        add(businessTopLabel);

        business2TopLabel = new JLabel();
        business2TopLabel.setFont(GraphicsHelper.getFont(13, null));
        business2TopLabel.setForeground(Color.white);
        business2TopLabel.setBounds(470, GraphicsParameters.bigFrameBottomY - 380, 300, 40);
        business2TopLabel.setText("Ressources reçues :");
        add(business2TopLabel);

        ressourceLabel = new JLabel();
        ressourceLabel.setFont(GraphicsHelper.getFont(13, null));
        ressourceLabel.setForeground(Color.white);
        ressourceLabel.setBounds(270, GraphicsParameters.bigFrameBottomY - 50, 300, 40);
        ressourceLabel.setText("Le compte est bon");
        add(ressourceLabel);

        nbBateauLabel = new JLabel();
        nbBateauLabel.setFont(GraphicsHelper.getFont(13, null));
        nbBateauLabel.setForeground(Color.white);
        nbBateauLabel.setBounds(70, GraphicsParameters.smallFrameTopY + 50, 300, 40);
        nbBateauLabel.setText("Vous n'avez pas de bateau");
        add(nbBateauLabel);

        explicationLabel = new JLabel();
        explicationLabel.setFont(GraphicsHelper.getFont(13, null));
        explicationLabel.setForeground(Color.white);
        explicationLabel.setBounds(50, GraphicsParameters.smallFrameTopY - 30, 600, 100);
        explicationLabel.setText("<html>Dans cette étape, vous échangez des ressources avec la banque. Pour chaque bateau que vous possèdez, vous pouvez echanger avec la banque une ressource de votre choix</html>");
        add(explicationLabel);

        // Image des ressources
        ImageIcon image = GraphicsHelper.getImageIcon(GraphicsParameters.pathResCommerceFer, this);
        if (image.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathResCommerceFer, this).setVisible(true);
            System.exit(1);
        }
        resCommerceFer = new JLabel(image);
        resCommerceFer.setBounds((largeur - image.getIconWidth()) / 2, GraphicsParameters.bigFrameBottomY - 350, image.getIconWidth(), image.getIconHeight());
        add(resCommerceFer);

        boutonPlusResFer = new JButtonBase("+");
        boutonPlusResFer.setBounds(500, GraphicsParameters.bigFrameBottomY - 350, 50, 50);
        boutonPlusResFer.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonPlusResFer);
        add(boutonPlusResFer);
        boutonMoinResFer = new JButtonBase("-");
        boutonMoinResFer.setBounds(200, GraphicsParameters.bigFrameBottomY - 350, 50, 50);
        boutonMoinResFer.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonMoinResFer);
        add(boutonMoinResFer);

        image = GraphicsHelper.getImageIcon(GraphicsParameters.pathResCommerceTissu, this);
        if (image.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathResCommerceTissu, this).setVisible(true);
            System.exit(1);
        }
        resCommerceTissu = new JLabel(image);
        resCommerceTissu.setBounds((largeur - image.getIconWidth()) / 2, GraphicsParameters.bigFrameBottomY - 290, image.getIconWidth(), image.getIconHeight());
        add(resCommerceTissu);

        boutonPlusResTissu = new JButtonBase("+");
        boutonPlusResTissu.setBounds(500, GraphicsParameters.bigFrameBottomY - 290, 50, 50);
        boutonPlusResTissu.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonPlusResTissu);
        add(boutonPlusResTissu);
        boutonMoinResTissu = new JButtonBase("-");
        boutonMoinResTissu.setBounds(200, GraphicsParameters.bigFrameBottomY - 290, 50, 50);
        boutonMoinResTissu.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonMoinResTissu);
        add(boutonMoinResTissu);



        image = GraphicsHelper.getImageIcon(GraphicsParameters.pathResCommercePoterie, this);
        if (image.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathResCommercePoterie, this).setVisible(true);
            System.exit(1);
        }
        resCommercePoterie = new JLabel(image);
        resCommercePoterie.setBounds((largeur - image.getIconWidth()) / 2, GraphicsParameters.bigFrameBottomY - 230, image.getIconWidth(), image.getIconHeight());
        add(resCommercePoterie);

        boutonPlusResPoterie = new JButtonBase("+");
        boutonPlusResPoterie.setBounds(500, GraphicsParameters.bigFrameBottomY - 230, 50, 50);
        boutonPlusResPoterie.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonPlusResPoterie);
        add(boutonPlusResPoterie);
        boutonMoinResPoterie = new JButtonBase("-");
        boutonMoinResPoterie.setBounds(200, GraphicsParameters.bigFrameBottomY - 230, 50, 50);
        boutonMoinResPoterie.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonMoinResPoterie);
        add(boutonMoinResPoterie);


        image = GraphicsHelper.getImageIcon(GraphicsParameters.pathResCommercePierre, this);
        if (image.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathResCommercePierre, this).setVisible(true);
            System.exit(1);
        }
        resCommercePierre = new JLabel(image);
        resCommercePierre.setBounds((largeur - image.getIconWidth()) / 2, GraphicsParameters.bigFrameBottomY - 170, image.getIconWidth(), image.getIconHeight());
        add(resCommercePierre);

        boutonPlusResPierre = new JButtonBase("+");
        boutonPlusResPierre.setBounds(500, GraphicsParameters.bigFrameBottomY - 170, 50, 50);
        boutonPlusResPierre.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonPlusResPierre);
        add(boutonPlusResPierre);
        boutonMoinResPierre = new JButtonBase("-");
        boutonMoinResPierre.setBounds(200, GraphicsParameters.bigFrameBottomY - 170, 50, 50);
        boutonMoinResPierre.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonMoinResPierre);
        add(boutonMoinResPierre);


        image = GraphicsHelper.getImageIcon(GraphicsParameters.pathResCommerceBois, this);
        if (image.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathResCommerceBois, this).setVisible(true);
            System.exit(1);
        }
        resCommerceBois = new JLabel(image);
        resCommerceBois.setBounds((largeur - image.getIconWidth()) / 2, GraphicsParameters.bigFrameBottomY - 110, image.getIconWidth(), image.getIconHeight());
        add(resCommerceBois);

        boutonPlusResBois = new JButtonBase("+");
        boutonPlusResBois.setBounds(500, GraphicsParameters.bigFrameBottomY - 110, 50, 50);
        boutonPlusResBois.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonPlusResBois);
        add(boutonPlusResBois);
        boutonMoinResBois = new JButtonBase("-");
        boutonMoinResBois.setBounds(200, GraphicsParameters.bigFrameBottomY - 110, 50, 50);
        boutonMoinResBois.addActionListener(this);
        GraphicsHelper.setCursorHand(boutonMoinResBois);
        add(boutonMoinResBois);

        afficherLabelRessource();

        repaint();
    }

    public void afficherLabelRessource() {

        resCommercePlusBois = new JLabel();
        resCommercePlusFer = new JLabel();
        resCommercePlusTissu = new JLabel();
        resCommercePlusPierre = new JLabel();
        resCommercePlusPoterie = new JLabel();
        resCommercePlusBois.setFont(GraphicsHelper.getFont(13, null));
        resCommercePlusFer.setFont(GraphicsHelper.getFont(13, null));
        resCommercePlusTissu.setFont(GraphicsHelper.getFont(13, null));
        resCommercePlusPierre.setFont(GraphicsHelper.getFont(13, null));
        resCommercePlusPoterie.setFont(GraphicsHelper.getFont(13, null));
        resCommercePlusBois.setForeground(Color.white);
        resCommercePlusFer.setForeground(Color.white);
        resCommercePlusTissu.setForeground(Color.white);
        resCommercePlusPoterie.setForeground(Color.white);
        resCommercePlusPierre.setForeground(Color.white);
        resCommercePlusFer.setBounds(460, GraphicsParameters.bigFrameBottomY - 340, 300, 40);
        resCommercePlusTissu.setBounds(460, GraphicsParameters.bigFrameBottomY - 280, 300, 40);
        resCommercePlusPoterie.setBounds(460, GraphicsParameters.bigFrameBottomY - 220, 300, 40);
        resCommercePlusPierre.setBounds(460, GraphicsParameters.bigFrameBottomY - 160, 300, 40);
        resCommercePlusBois.setBounds(460, GraphicsParameters.bigFrameBottomY - 100, 300, 40);
        resCommercePlusFer.setText("0 :");
        resCommercePlusTissu.setText("0 :");
        resCommercePlusPoterie.setText("0 :");
        resCommercePlusPierre.setText("0 :");
        resCommercePlusBois.setText("0 :");
        resCommerceMoinBois = new JLabel();
        resCommerceMoinFer = new JLabel();
        resCommerceMoinTissu = new JLabel();
        resCommerceMoinPierre = new JLabel();
        resCommerceMoinPoterie = new JLabel();
        resCommerceMoinBois.setFont(GraphicsHelper.getFont(13, null));
        resCommerceMoinFer.setFont(GraphicsHelper.getFont(13, null));
        resCommerceMoinTissu.setFont(GraphicsHelper.getFont(13, null));
        resCommerceMoinPierre.setFont(GraphicsHelper.getFont(13, null));
        resCommerceMoinPoterie.setFont(GraphicsHelper.getFont(13, null));
        resCommerceMoinBois.setForeground(Color.white);
        resCommerceMoinFer.setForeground(Color.white);
        resCommerceMoinTissu.setForeground(Color.white);
        resCommerceMoinPoterie.setForeground(Color.white);
        resCommerceMoinPierre.setForeground(Color.white);
        resCommerceMoinFer.setBounds(260, GraphicsParameters.bigFrameBottomY - 340, 300, 40);
        resCommerceMoinTissu.setBounds(260, GraphicsParameters.bigFrameBottomY - 280, 300, 40);
        resCommerceMoinPoterie.setBounds(260, GraphicsParameters.bigFrameBottomY - 220, 300, 40);
        resCommerceMoinPierre.setBounds(260, GraphicsParameters.bigFrameBottomY - 160, 300, 40);
        resCommerceMoinBois.setBounds(260, GraphicsParameters.bigFrameBottomY - 100, 300, 40);
        resCommerceMoinFer.setText(": 0");
        resCommerceMoinTissu.setText(": 0");
        resCommerceMoinPoterie.setText(": 0");
        resCommerceMoinPierre.setText(": 0");
        resCommerceMoinBois.setText(": 0");
        add(resCommercePlusBois);
        add(resCommercePlusPierre);
        add(resCommercePlusPoterie);
        add(resCommercePlusTissu);
        add(resCommercePlusFer);
        add(resCommerceMoinBois);
        add(resCommerceMoinPierre);
        add(resCommerceMoinPoterie);
        add(resCommerceMoinTissu);
        add(resCommerceMoinFer);
    }

    protected void majLabelRessource(JLabel labelRessourceMoin, JLabel labelRessourcePlus, int nbRessource) {
        if (nbRessource >= 0) {
            labelRessourceMoin.setText(": 0");
            labelRessourcePlus.setText(nbRessource + " :");
        } else {
            labelRessourceMoin.setText(": " + Math.abs(nbRessource));
            labelRessourcePlus.setText("0 :");
        }
    }

    public void majLabelRessource() {

        majLabelRessource(resCommerceMoinFer, resCommercePlusFer, nbRessourceSel.get(FerDeLance.class));
        majLabelRessource(resCommerceMoinTissu, resCommercePlusTissu, nbRessourceSel.get(Tissu.class));
        majLabelRessource(resCommerceMoinPoterie, resCommercePlusPoterie, nbRessourceSel.get(Poterie.class));
        majLabelRessource(resCommerceMoinPierre, resCommercePlusPierre, nbRessourceSel.get(Pierre.class));
        majLabelRessource(resCommerceMoinBois, resCommercePlusBois, nbRessourceSel.get(Bois.class));

    }

    public void majRessourceDispo() {

        int differenceRes = differenceRessource();
        StringBuilder ressourceDispo = new StringBuilder();
        if (differenceRes == 0) {
            ressourceDispo.append("<html>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color='blue'>Le compte est bon !</font></html>");
        } else {
            ressourceDispo.append("<html>Il vous reste ");
            if (differenceRes > 0) {
                ressourceDispo.append("<font color='red'>");
            } else {
                ressourceDispo.append("<font color='green'>");
            }

            ressourceDispo.append(Math.abs(differenceRes));
            if (differenceRes > 1) {
                ressourceDispo.append(" ressources");
            } else {
                ressourceDispo.append(" ressource");
            }

            if (differenceRes > 0) {
                ressourceDispo.append(" à donner<font></html>");
            } else {
                ressourceDispo.append(" à recevoir<font></html>");
            }

        }
        ressourceLabel.setText(ressourceDispo.toString());

    }

    public void majNbBateau() {

        StringBuilder nbBateauString = new StringBuilder();
        if (nbBateau > 0) {
            nbBateauString.append("Vous disposez de ");
            nbBateauString.append(nbBateau);
            if (nbBateau > 1) {
                nbBateauString.append(" bateaux.");
            } else {
                nbBateauString.append(" bateau.");
            }
        } else {
            nbBateauString.append("Vous n'avez pas de bateau.");
        }
        nbBateauLabel.setText(nbBateauString.toString());

    }

    public void reset() {
        nbRessource = controller.getNombreRessourceJoueurCourant();
        nbRessourceSel = new HashMap<Class, Integer>();
        nbRessourceSel.put(Bois.class, 0);
        nbRessourceSel.put(Pierre.class, 0);
        nbRessourceSel.put(Poterie.class, 0);
        nbRessourceSel.put(Tissu.class, 0);
        nbRessourceSel.put(FerDeLance.class, 0);

        majEnableButton();
        majNbBateau();
        majLabelRessource();
        majRessourceDispo();

        repaint();
    }

    public int differenceRessource() {
        int difference = 0;

        for (int val : nbRessourceSel.values()) {
            difference += val;
        }

        return difference;
    }

    public int nbRessourceEchangee() {
        int nb = 0;

        for (int val : nbRessourceSel.values()) {
            if (val < 0) {
                nb += Math.abs(val);
            }
        }

        return nb;
    }

    public void majEnableButton() {
        // Bois
        if (nbRessource.get(Bois.class) > 0 && nbRessource.get(Bois.class) + nbRessourceSel.get(Bois.class) > 0 && nbRessourceEchangee() < nbBateau) {
            boutonMoinResBois.setEnabled(true);
        } else {
            boutonMoinResBois.setEnabled(false);
        }
        // Pierre
        if (nbRessource.get(Pierre.class) > 0 && nbRessource.get(Pierre.class) + nbRessourceSel.get(Pierre.class) > 0 && nbRessourceEchangee() < nbBateau) {
            boutonMoinResPierre.setEnabled(true);
        } else {
            boutonMoinResPierre.setEnabled(false);
        }
        // Poterie
        if (nbRessource.get(Poterie.class) > 0 && nbRessource.get(Poterie.class) + nbRessourceSel.get(Poterie.class) > 0 && nbRessourceEchangee() < nbBateau) {
            boutonMoinResPoterie.setEnabled(true);
        } else {
            boutonMoinResPoterie.setEnabled(false);
        }
        // Tissu
        if (nbRessource.get(Tissu.class) > 0 && nbRessource.get(Tissu.class) + nbRessourceSel.get(Tissu.class) > 0 && nbRessourceEchangee() < nbBateau) {
            boutonMoinResTissu.setEnabled(true);
        } else {
            boutonMoinResTissu.setEnabled(false);
        }
        // fer de lance
        if (nbRessource.get(FerDeLance.class) > 0 && nbRessource.get(FerDeLance.class) + nbRessourceSel.get(FerDeLance.class) > 0 && nbRessourceEchangee() < nbBateau) {
            boutonMoinResFer.setEnabled(true);
        } else {
            boutonMoinResFer.setEnabled(false);
        }

        if (differenceRessource() < 0) {
            boutonPlusResBois.setEnabled(true);
            boutonPlusResPierre.setEnabled(true);
            boutonPlusResPoterie.setEnabled(true);
            boutonPlusResTissu.setEnabled(true);
            boutonPlusResFer.setEnabled(true);
        } else {
            boutonPlusResBois.setEnabled(false);
            boutonPlusResPierre.setEnabled(false);
            boutonPlusResPoterie.setEnabled(false);
            boutonPlusResTissu.setEnabled(false);
            boutonPlusResFer.setEnabled(false);
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == etapeSuivante) {
            // Bouton étape suivante
            if (differenceRessource() != 0) {
                GraphicsHelper.afficherErreur("Commerce", "Le compte n'est pas bon !", this).setVisible(true);
            } else {
                for (Class res : nbRessourceSel.keySet()) {
                    controller.majRessourceJoueurCourant(res, nbRessourceSel.get(res), true);
                }

                controller.etapeSuivante();
            }
        } else if (e.getSource() == clearBusiness) {
            reset();
        } else {
            boolean moins = false;
            Class ressource = null;

            if (e.getSource() == boutonMoinResBois) {
                moins = true;
                ressource = Bois.class;
            }
            if (e.getSource() == boutonMoinResPierre) {
                moins = true;
                ressource = Pierre.class;
            }
            if (e.getSource() == boutonMoinResPoterie) {
                moins = true;
                ressource = Poterie.class;
            }
            if (e.getSource() == boutonMoinResTissu) {
                moins = true;
                ressource = Tissu.class;
            }
            if (e.getSource() == boutonMoinResFer) {
                moins = true;
                ressource = FerDeLance.class;
            }
            if (e.getSource() == boutonPlusResBois) {
                ressource = Bois.class;
            }
            if (e.getSource() == boutonPlusResPierre) {
                ressource = Pierre.class;
            }
            if (e.getSource() == boutonPlusResPoterie) {
                ressource = Poterie.class;
            }
            if (e.getSource() == boutonPlusResTissu) {
                ressource = Tissu.class;
            }
            if (e.getSource() == boutonPlusResFer) {
                ressource = FerDeLance.class;
            }

            int nb = nbRessourceSel.get(ressource);
            nb += (moins ? -1 : 1);

            nbRessourceSel.put(ressource, nb);

            majRessourceDispo();
            majLabelRessource();
            majEnableButton();

            repaint();
        }

    }

    @Override
    public void bateauChanged(int nbBateau) {
        this.nbBateau = nbBateau;
    }
}
